/*
 * grupoBL.java
 *
 * Created on 15 de febrero de 2008, 06:53 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package BL;

import BE.grupo;
import BE.jugadorxDivision;
import BE.miDouble;
import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author Billy
 */
public class grupoBL {
    
    private grupo[] gruposFormados;    
    public ArrayList<jugadorxDivision> jugadoresdeTorneo;    
    private ArrayList<miDouble> listadePuntajes;
//    jugadorxDivxRondaBL jxdxrBL;
    
    /** Creates a new instance of grupoBL */
    public grupoBL() {
//        this.jxdxrBL = new jugadorxDivxRondaBL();
        
    }
    
    public grupo[] crearGruposdePuntuacion(ArrayList<jugadorxDivision> jugadoresdeTorneo){  
        //this.jugadoresdeTorneo = jugadoresdeTorneo;
        ArrayList<miDouble> lstpuntajesUnicos = this.determinarPuntajesUnicos(jugadoresdeTorneo);
        int tamanoListaPuntajes = lstpuntajesUnicos.size();
        gruposFormados= new grupo[tamanoListaPuntajes];

        for(int k=0; k<tamanoListaPuntajes; k++){
            double puntajedeGrupo = lstpuntajesUnicos.get(k).getmiDouble();
            gruposFormados[k] = new grupo(puntajedeGrupo,jugadoresdeTorneo);
            gruposFormados[k].agregarJugadoresconPuntaje(puntajedeGrupo);            
        }
        return gruposFormados;
    }    
    
    
    public ArrayList<miDouble> determinarPuntajesUnicos(ArrayList<jugadorxDivision> jugadoresdeTorneo){        
        listadePuntajes = new ArrayList<miDouble>();        
        ordenarJugadores(jugadoresdeTorneo);
        double puntajeInicial = jugadoresdeTorneo.get(0).getPuntajeTotal();
        listadePuntajes.add(new miDouble(puntajeInicial));
        for(jugadorxDivision player : jugadoresdeTorneo){
            double puntajedeJugador = player.getPuntajeTotal();
            if(estaenListadePuntaje(puntajedeJugador, listadePuntajes)==false){
                listadePuntajes.add(new miDouble(puntajedeJugador));
            }
        }
        return listadePuntajes;
    }
    
    public boolean estaenListadePuntaje(double puntaje, ArrayList<miDouble> lista){
        for(miDouble cantidad : lista){
            if(puntaje == cantidad.getmiDouble()){
                return true;
            }
        }        
    return false;
    }    
    /*viernes 11 de enero del 2008. Billy Colonia*/
    public void crearSubGrupo( ArrayList<jugadorxDivision> lista, 
                                               int ronda, 
                                               String tipoLista,
                                               ArrayList<jugadorxDivision> subGrupoS1,
                                               ArrayList<jugadorxDivision> subGrupoS2
                                               ){
        
        jugadorxDivision jxd;
        int tamanoLista =lista.size();                 
        int p = tamanoLista>>1;
        int contadorBlancos=0;
                      
        if(tipoLista.equals("homogeneo")==true){
                //int contadorNegros=0;                
                for(int i=0; i<tamanoLista; i++){
                    /*Comienzo con blancos*/
                    jxd = lista.get(i);
                    if(jxd.getTEMPColorObligatorio() == 1)/*Blanco*/{
                        subGrupoS1.add(jxd);
                        jxd.setTEMPtipoSubGrupo("S1");                        
                        contadorBlancos++;
                    }
                } 
                if(contadorBlancos < p){
                    for(int i=0; i<tamanoLista; i++){
                        /*Comienzo con blancos*/
                        jxd = lista.get(i);                        
                        if(contadorBlancos < p){
                            if(jxd.getTEMPColorObligatorio() == 0)/*Nada*/{
                                subGrupoS1.add(jxd);
                                jxd.setTEMPtipoSubGrupo("S1");                        
                                contadorBlancos++;
                            }                        
                        }
                        else break;
                    }                                  
                }                    
                boolean condicion;
                for(int i=0; i<tamanoLista; i++){
                    jxd = lista.get(i);       
                    condicion = jxd.getTEMPtipoSubGrupo().equals("S1");
                    if(condicion == false){
                       subGrupoS2.add(jxd);                        
                    }
                }                       
        }
        
        /*Ahora heterogeneo*/
        else if(tipoLista.equals("heterogeneo")==true){        
                for(int i=0;i<tamanoLista;i++){                    
                    int dato = lista.get(i).getTEMPFlotante();                    
                    if(dato == 1) subGrupoS1.add(lista.get(i));
                    else subGrupoS2.add(lista.get(i));                        
                }                      
        }
        
        /*Agregado el viernes 07 de marzo del 2008*/
        if(subGrupoS1.size()==0 || subGrupoS2.size()==0){
            
            for (Iterator it = subGrupoS1.iterator (); it.hasNext (); ) {
                it.next ();
                it.remove ();
            }
                        
            for (Iterator it = subGrupoS2.iterator (); it.hasNext (); ) {
                it.next ();
                it.remove ();
            }
            for(int i=0;i<p;i++)
                subGrupoS1.add(lista.get(i));                       
            for(int i=p;i<tamanoLista;i++){
                subGrupoS2.add(lista.get(i));                                        
            }                              
        }     
        
        this.ordenarJugadores(subGrupoS1);  
        this.ordenarJugadoresxId(subGrupoS2);
        //return grupoRpta;
    }    

    
    public void ordenarJugadores(ArrayList<jugadorxDivision> jugdeTorneo){        
        int numPlayers = jugdeTorneo.size();
        jugadorxDivision tmpPlayer;        
        int end;
                
        for (int inicio = 1; inicio < numPlayers; inicio++) {
            end = inicio;
            tmpPlayer = jugdeTorneo.get(inicio);
            while ( (end > 0) && jugdeTorneo.get(end-1).mayorQue(tmpPlayer))
            {
                    jugdeTorneo.set(end,jugdeTorneo.get(end - 1));
                    end--;
            } 
            jugdeTorneo.set(end,tmpPlayer);
        }
    }    
    
    /*Martes, 22 de enero del 2008. 4:31 pm*/
    void ordenarJugadoresxId(ArrayList<jugadorxDivision> jugdeTorneo){
        int numPlayers = jugdeTorneo.size();
        jugadorxDivision tmpPlayer;
        int end;
        for (int inicio = 1; inicio < numPlayers; inicio++){
            end = inicio;
            tmpPlayer = jugdeTorneo.get(inicio);
            while ( (end > 0) && jugdeTorneo.get(end-1).menorxId(tmpPlayer)){
                    jugdeTorneo.set(end,jugdeTorneo.get(end - 1));
                    end--;
            } 
            jugdeTorneo.set(end,tmpPlayer);
        }
    }    
   
/*Corregido el jueves 06 de marzo del 2008*/
    boolean noPuedeJugarenelGrupo(int ronda, 
                                  jugadorxDivision persona, 
                                  ArrayList<jugadorxDivision> lista, 
                                  boolean condicionColor){        
        boolean condicion1, condicion2;
        if(condicionColor == true){
            for(jugadorxDivision player: lista){
                if(persona.getNumeroId() != player.getNumeroId()){
                    condicion1 = persona.heJugadoCon(player);
                    condicion2 = this.eliminarporColor(ronda, persona, player);
                    if(condicion1==true || condicion2==true)  continue;                                                
                    else return false;                                
                }
            }
//            return true;        
        }
        else{
            for(jugadorxDivision player: lista){
                if(persona.getNumeroId() != player.getNumeroId()){
                    condicion1 = persona.heJugadoCon(player);
                    if(condicion1 == true)  continue;                                                
                    else return false;                                
                }
            }
//            return true;                      
        }
        return true;
    }
    /*Corregido el jueves 06 de marzo del 2008*/
    public ArrayList<jugadorxDivision> listaJugadoresAptos(int ronda, 
                                                           jugadorxDivision persona, 
                                                           ArrayList<jugadorxDivision> listaBase,
                                                           boolean condicionColor){
        
        ArrayList<jugadorxDivision> listaAptos = new ArrayList<jugadorxDivision>();
        boolean condicion1, condicion2;
        if(condicionColor== true){
            for(jugadorxDivision player: listaBase){
                if(persona.getNumeroId() != player.getNumeroId()){
                    condicion1 = persona.heJugadoCon(player);
                    condicion2 = this.eliminarporColor(ronda, persona, player);
                    if(condicion1 == false && condicion2 == false)  listaAptos.add(player);                                                
                }
            }
//            return listaAptos;        
        }
        else{
            for(jugadorxDivision player: listaBase){
                if(persona.getNumeroId() != player.getNumeroId()){
                    condicion1 = persona.heJugadoCon(player);
                    if(condicion1 == false)  listaAptos.add(player);                                                
                }
            }
//            return listaAptos;         
        }
       return listaAptos;                 
    }
    
    public boolean sePuedePareoxColores(int ronda, ArrayList<jugadorxDivision> personas){
        int sumaBlancas = 0, sumaNegras = 0, sumaOtras = 0, dato;
        boolean condicion1, condicion2;
        for(jugadorxDivision player: personas){
            dato = player.getTEMPColorObligatorio();
            switch(dato){
                case 1: sumaBlancas++; break;
                case 2: sumaNegras++; break;
                case 0: sumaOtras++; break;
            }
        }        
        condicion1 = sumaNegras > sumaBlancas + sumaOtras;
        condicion2 = sumaBlancas > sumaNegras + sumaOtras;
        if(condicion1 || condicion2)  return true;
        return false;
    }
    /*Miercoles 27 de febrero del 2008*/
    public boolean noPuedenJugarEnEsteGrupo(int ronda, 
                                            ArrayList<jugadorxDivision> personas, 
                                            boolean condicionColor){
        for(jugadorxDivision player: personas){
            boolean nopuedeJugar;
            nopuedeJugar = noPuedeJugarenelGrupo(ronda, player, personas,condicionColor);
            if(nopuedeJugar == true) return true;
        }  
        return false;
    }
    
    public ArrayList<jugadorxDivision> noPuedenJugarenelGrupo(int ronda, 
                                                              ArrayList<jugadorxDivision> personas,
                                                              boolean condicionColor){
        ArrayList<jugadorxDivision> lista = new ArrayList<jugadorxDivision>();
        boolean encontrado;
        for(jugadorxDivision player: personas){
            boolean nopuedeJugar;
            nopuedeJugar = noPuedeJugarenelGrupo(ronda, player, personas, condicionColor);
            if(nopuedeJugar == true) lista.add(player);
        }  
        
        /*(Agregado) Miercoles 20 de febrero del 2008. Se tiene que considerar caso de cantidad de jugadores obligados
         a utilizar un color.*/
        int sumaBlancas = 0, sumaNegras = 0, sumaOtras = 0, dato;
        
        for(jugadorxDivision player: personas){
            encontrado = buscarJugador(player.getNumeroId(), lista);
            if(encontrado ==false){
                //dato = determinarSgteColorxJugador(ronda, player);
                dato = player.getTEMPColorObligatorio();
                switch(dato){
                    case 1: sumaBlancas++; break;
                    case 2: sumaNegras++; break;
                    case 0: sumaOtras++; break;
                }            
            }
        }
        System.out.println("SumaBlancas: "+sumaBlancas);
        System.out.println("SumaNegras: "+sumaNegras);
        System.out.println("SumaOtras: "+sumaOtras);
        
        int numerodeJugadoresaSacar = 0;
        int contador =0;
        if(sumaNegras > sumaBlancas + sumaOtras){
           /*Es necesario sacar a los jugadores excedentes.*/ 
            numerodeJugadoresaSacar = sumaNegras - (sumaBlancas + sumaOtras);
            
            for(jugadorxDivision player: personas){
                dato = player.getTEMPColorObligatorio();
                if(dato == 2 ){
                    lista.add(player);
                    contador++;
                    if(contador == numerodeJugadoresaSacar) break;
                }
            }        
        }
        else{
            if(sumaBlancas > sumaNegras + sumaOtras){
               /*Es necesario sacar a los jugadores excedentes.*/ 
                numerodeJugadoresaSacar = sumaBlancas - (sumaNegras + sumaOtras); 
                
                for(jugadorxDivision player: personas){
                    dato = player.getTEMPColorObligatorio();
                    if(dato == 1 ){
                        lista.add(player);
                        contador++;
                        if(contador == numerodeJugadoresaSacar) break;
                    }
                }                    
            }            
      
        }
                         
        return lista;
    }    

    private boolean buscarJugador(int id, ArrayList<jugadorxDivision> arrJugadoresxDivision ){
        for(int i=0; i < arrJugadoresxDivision.size(); i++){
            if( arrJugadoresxDivision.get(i).getNumeroId() == id) 
                return true;
        }        
        return false;
    }
    
    public int determinarSgteColorxJugador(int ronda, jugadorxDivision jugadorS1){
         int sumaColoresJug1 = jugadorS1.dameSumadeColores();         
         String dosColoresJug1 =jugadorS1.dosColoresSeguidos(ronda);
         
         if(sumaColoresJug1 == -2 || dosColoresJug1.equals("B")==true){
            return 1; /*blanco*/
         }
         else if(sumaColoresJug1 == 2 || dosColoresJug1.equals("N")==true){
            return 2; /*negro*/
         }
         else return 0;             
    }  
    
    boolean eliminarporColor(int ronda, jugadorxDivision jugadorS1, jugadorxDivision jugadorS2){
         int sumaColoresJug1 = jugadorS1.dameSumadeColores();
         int sumaColoresJug2 = jugadorS2.dameSumadeColores();
         
         String dosColoresJug1 =jugadorS1.dosColoresSeguidos(ronda);
         String dosColoresJug2 =jugadorS2.dosColoresSeguidos(ronda);
         
         if( (sumaColoresJug1 == -2 && sumaColoresJug2 == -2) || 
             (sumaColoresJug2 == 2 && sumaColoresJug1 == 2)){
             return true;
         }                  
         else if(dosColoresJug1.equals("B")==true && dosColoresJug2.equals("B")==true) {
            return true;
         }      
         else if(dosColoresJug2.equals("N")==true && dosColoresJug1.equals("N")==true){
            return true;         
         }      
         /*Condiciones agregadas. Jueves 21 de febrero del 2008. 10:10 pm.*/
         else if(sumaColoresJug1 == -2 && dosColoresJug2.equals("B")==true) {
            return true;
         }      
         else if(sumaColoresJug1 == 2 && dosColoresJug2.equals("N")==true) {
            return true;
         }      
/**/
         else if(sumaColoresJug2 == -2 && dosColoresJug1.equals("B")==true) {
            return true;
         }      
         else if(sumaColoresJug2 == 2 && dosColoresJug1.equals("N")==true) {
            return true;
         }               
         return false;
    }    


}
